﻿Imports DevExpress.XtraLayout
Imports DevExpress.XtraEditors
Imports IControl.IControls
Imports IControl
Imports System.ComponentModel

Module Editor
    ''' <summary>
    ''' lấy ngày cuối năm của một date
    ''' </summary>
    ''' <param name="ngay">ngày</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayCuoiNam(ByVal ngay As Date) As Date
        Return New Date(ngay.Year, 12, 31)
    End Function
    ''' <summary>
    ''' lấy ngày đầu năm của một date
    ''' </summary>
    ''' <param name="ngay">giá trị date</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayDauNam(ByVal ngay As Date) As Date
        Return New Date(ngay.Year, 1, 1)
    End Function
    ''' <summary>
    ''' lấy position của bindingsource dựa vào tên cột dữ liệu - trả về integer vị trí (position) 
    ''' </summary>
    ''' <param name="bindingsource">BindingSource</param>
    ''' <param name="columnName">Tên cột</param>
    ''' <param name="value">Giá trị cần tìm (tương ứng với cột)</param>
    ''' <returns></returns>
    ''' <remarks>áp dụng cho fkbindingsource nếu ko tìm được position theo cách thông thường</remarks>
    Public Function getPositionBindingSource(ByVal bindingsource As BindingSource, ByVal columnName As String, ByVal value As Object) As Integer
        Dim prpcol As PropertyDescriptorCollection = bindingsource.CurrencyManager.GetItemProperties()
        Dim a As Integer = bindingsource.Find(prpcol(columnName), value)
        Return a
    End Function
    ''' <summary>
    ''' kiểm tra coi igridview đã có check hay chưa ? (dành cho igridview có setcolumhcheck() rồi )
    ''' </summary>
    ''' <param name="igridview">igridview</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getIsCheckGridView(ByVal igridview As IGridView) As Boolean
        igridview.setUpdateData()
        For index = 0 To igridview.RowCount - 1
            If CBool(igridview.GetRowCellValue(index, "Mark")) = True Then
                Return True
            End If
        Next
        Return False
    End Function
    ''' <summary>
    ''' kiểm tra một tham trị có tồn tại trong một danh sách giá trị của cột xtragrid không ?
    ''' </summary>
    ''' <param name="igridView1">igridview</param>
    ''' <param name="columnName1">tên cột dữ liệu</param>
    ''' <param name="value">giá trị nhập vô</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getExistColumnValue(ByVal igridView1 As IGridView, ByVal columnName1 As String, ByVal value As String) As Boolean
        For index = 0 To igridView1.RowCount - 2
            Try
                If igridView1.GetRowCellValue(index, columnName1).ToString.ToUpper = value.ToString.ToUpper Then
                    Return True
                    Exit Function
                End If
            Catch ex As Exception
                MessageBox.Show("getExistColumnValue " & ex.Message)
            End Try
        Next
        Return False
    End Function
    ''' <summary>
    ''' Lấy dòng dữ liệu của datatble (để truy cập các trường trong dòng dữ liệu đó)
    ''' </summary>
    ''' <param name="dt">Datatable</param>
    ''' <param name="column">Tên cột</param>
    ''' <param name="value">Giá trị truyền vô để xác định dòng dữ liệu nào - thường là mã hoặc uid</param>
    ''' <returns>Datarow</returns>
    ''' <remarks></remarks>
    Public Function getRow(ByVal dt As DataTable, ByVal bd As BindingSource, column As String, ByVal value As Object) As DataRow
        Try
            Dim position As Integer = bd.Find(column, value)
            Return dt.Rows(position)
        Catch ex As Exception
            MessageBox.Show("không tìm được vị trí dòng dữ liệu" & ex.Message)
        End Try
        Return Nothing
    End Function
    Public Sub setDMThoiGian(ByVal sle As ISearchLookupEdit, ByVal tungay As IDateEdit, ByVal denngay As IDateEdit)
        If IsDBNull(sle.EditValue) Or IsNothing(sle.EditValue) Then
            Exit Sub
        Else
            If sle.EditValue = "TN" Then
                tungay.EditValue = getNgayDauThang(Today)
                denngay.EditValue = getNgayCuoiThang(Today)
            End If
            If sle.EditValue = "TT" Then
                tungay.EditValue = getNgayDauThang(Today.Date.AddMonths(-1))
                denngay.EditValue = getNgayCuoiThang(Today.Date.AddMonths(-1))
            End If
            If sle.EditValue = "T1" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 1, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 1, 1))
            End If
            If sle.EditValue = "T2" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 2, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 2, 1))
            End If
            If sle.EditValue = "T3" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 3, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 3, 1))
            End If
            If sle.EditValue = "T4" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 4, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 4, 1))
            End If
            If sle.EditValue = "T5" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 5, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 5, 1))
            End If
            If sle.EditValue = "T6" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 6, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 6, 1))
            End If
            If sle.EditValue = "T7" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 7, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 7, 1))
            End If
            If sle.EditValue = "T8" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 8, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 8, 1))
            End If
            If sle.EditValue = "T9" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 9, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 9, 1))
            End If
            If sle.EditValue = "T10" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 10, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 10, 1))
            End If
            If sle.EditValue = "T11" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 11, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 11, 1))
            End If
            If sle.EditValue = "T12" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 12, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 12, 1))
            End If
            If sle.EditValue = "All" Then
                tungay.EditValue = New Date(2012, 1, 1)
                denngay.EditValue = New Date(2020, 1, 1)
            End If
        End If
    End Sub
    ''' <summary>
    ''' kiểm tra coi có thuộc tháng đó hay không ?
    ''' </summary>
    ''' <param name="ngay"></param>
    ''' <param name="thang"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayCoThuocThangKhong(ByVal ngay As Date, ByVal thang As Date) As Boolean
        If ngay.Month = thang.Month And ngay.Year = thang.Year Then
            Return True
        Else
            Return False
        End If
    End Function
    ''' <summary>
    ''' lấy ngày cuối tháng
    ''' </summary>
    ''' <param name="ngay"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayCuoiThang(ByVal ngay As Date) As Date
        Return New Date(ngay.Year, ngay.Month, Date.DaysInMonth(ngay.Year, ngay.Month))
    End Function
    ''' <summary>
    ''' Lấy ngày đầu tháng
    ''' </summary>
    ''' <param name="ngay">Ngày</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayDauThang(ByVal ngay As Date) As Date
        Return New Date(ngay.Year, ngay.Month, 1)
    End Function
    ''' <summary>
    ''' Lấy kỳ kế toán (recycleid)
    ''' </summary>
    ''' <param name="ngay">Ngày</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getRecycleId(ByVal ngay As Date) As String
        Return ngay.Year.ToString & Format(ngay.Month, "00").ToString
    End Function
    ''' <summary>
    ''' lấy ngày trước đó 
    ''' </summary>
    ''' <param name="ngay">Ngày</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayTruoc(ByVal ngay As Date) As Date
        Dim newdate As Date = DateAdd(DateInterval.Day, -1, ngay)
        Return New Date(newdate.Year, newdate.Month, newdate.Day)
    End Function
    ''' <summary>
    ''' Lấy ngày đầu tháng của tháng trước đó
    ''' </summary>
    ''' <param name="ngay">Ngày</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayDauThang_ThangTruoc(ByVal ngay As Date) As Date
        Dim newdate As Date = ngay.AddMonths(-1)
        Return getNgayDauThang(newdate)
    End Function
    ''' <summary>
    ''' lấy ngày cuối tháng của tháng trước đó
    ''' </summary>
    ''' <param name="ngay">Ngày</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayCuoiThang_ThangTruoc(ByVal ngay As Date) As Date
        Dim newdate As Date = ngay.AddMonths(-1)
        Return getNgayCuoiThang(newdate)
    End Function
    Public Function getNgayDauThang_ThangSau(ByVal ngay As Date) As Date
        Dim newdate As Date = ngay.AddMonths(1)
        Return getNgayDauThang(newdate)
    End Function
    Public Function getNgayCuoiThang_ThangSau(ByVal ngay As Date) As Date
        Dim newdate As Date = ngay.AddMonths(1)
        Return getNgayCuoiThang(newdate)
    End Function
    Public Function getAfterRecycleId(ByVal ngay As Date) As String
        'nếu tháng 01 thì trước nó là tháng 12
        If ngay.Month = 12 Then
            Return (ngay.Year + 1).ToString & Format(1, "00").ToString
        Else
            Return ngay.Year.ToString & Format(ngay.Month + 1, "00").ToString
        End If
    End Function
    ''' <summary>
    ''' lấy kỳ kế toán trước đó
    ''' </summary>
    ''' <param name="ngay"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getPreRecycleId(ByVal ngay As Date) As String
        'nếu tháng 01 thì trước nó là tháng 12
        If ngay.Month = 1 Then
            Return (ngay.Year - 1).ToString & Format(12, "00").ToString
        Else
            Return ngay.Year.ToString & Format(ngay.Month - 1, "00").ToString
        End If
    End Function
    ''' <summary>
    ''' lấy guid từ string - lenght là chiều dài cần loại bỏ kể từ bắt đầu của chuỗi
    ''' </summary>
    ''' <param name="s"></param>
    ''' <param name="len"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getGuid(ByVal s As String, ByVal len As Integer) As System.Guid
        Dim lenght As Integer = s.Length
        s = s.Substring(len, lenght - len)
        Dim uid As System.Guid = New System.Guid(s)
        Return uid
    End Function

    Public Sub setReadonly(ByVal lc As LayoutControl, ByVal b As Boolean)
        For Each item In lc.Items
            If TypeOf item Is LayoutControlItem Then
                Dim ct As Control = DirectCast(item, LayoutControlItem).Control
                If TypeOf ct Is BaseEdit Then
                    If TypeOf ct Is SearchLookUpEdit Then
                        'DirectCast(ct, SearchLookUpEdit).Properties.ReadOnly = b
                        If b Then
                            DirectCast(ct, SearchLookUpEdit).Properties.Buttons(0).Visible = False
                        Else
                            DirectCast(ct, SearchLookUpEdit).Properties.Buttons(0).Visible = True
                        End If
                    End If
                    If TypeOf ct Is TextEdit Then
                        DirectCast(ct, TextEdit).Properties.ReadOnly = b
                    End If
                    If TypeOf ct Is DateEdit Then
                        DirectCast(ct, DateEdit).Properties.ReadOnly = b
                        If b Then
                            DirectCast(ct, DateEdit).Properties.Buttons(0).Visible = False
                        Else
                            DirectCast(ct, DateEdit).Properties.Buttons(0).Visible = True
                        End If
                    End If
                End If
            End If
        Next
    End Sub
    ''' <summary>
    ''' phân quyền cho hiển thị hay không ?
    ''' </summary>
    ''' <param name="lc"></param>
    ''' <param name="b"></param>
    ''' <remarks></remarks>
    Public Sub setVisible(ByVal lc As LayoutControl, ByVal b As Boolean)
        For Each item In lc.Items
            If TypeOf item Is LayoutControlItem Then
                Dim ct As Control = DirectCast(item, LayoutControlItem).Control
                'If TypeOf ct Is BaseEdit Then
                '    If TypeOf ct Is SearchLookUpEdit Then
                '        DirectCast(ct, SearchLookUpEdit).Visible = b
                '    End If
                '    If TypeOf ct Is TextEdit Then
                '        DirectCast(ct, TextEdit).Visible = b
                '    End If
                '    If TypeOf ct Is DateEdit Then
                '        DirectCast(ct, TextEdit).Visible = b
                '    End If
                'End If

            End If
        Next
    End Sub
    Public Function NumToText(ByVal s As String) As String
        Dim So() As String = {"không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"} 'Cái này nên để người dùng tự nhập vào vì có nhiều bảng mã khác nhau 
        Dim So1() As String = {"lẻ", "mốt", "tư", "lăm", "mười", "mươi"}
        Dim Hang() As String = {"", "ngàn", "triệu", "tỷ"}
        Dim I, J, donvi, chuc, tram As Integer
        Dim StrValue As String
        StrValue = ""
        I = Len(s)
        For J = 0 To I - 1
            If Microsoft.VisualBasic.Left(s, 1) = "0" Then
                s = Microsoft.VisualBasic.Right(s, I - J)
            End If
        Next J
        If s = "0" Then
            NumToText = So(0)
            Exit Function
        End If
        I = Len(s)
        If I = 0 Then
            StrValue = ""
        Else
            J = 0
            Do While I > 0
                donvi = Int(Mid(s, I, 1))
                I = I - 1
                If I > 0 Then
                    chuc = Int(Mid(s, I, 1))
                Else
                    chuc = -1
                End If
                I = I - 1
                If I > 0 Then
                    tram = Int(Mid(s, I, 1))
                Else
                    tram = -1
                End If
                I = I - 1
                If donvi > 0 Or chuc > 0 Or tram > 0 Or J = 3 Then
                    StrValue = Hang(J) & " " & StrValue
                End If
                J = J + 1
                If J > 3 Then
                    J = 1
                End If
                If donvi = 1 And chuc > 1 Then
                    StrValue = So1(1) & " " & StrValue
                ElseIf donvi = 4 And chuc > 1 Then
                    StrValue = So1(2) & " " & StrValue
                Else
                    If donvi = 5 And chuc > 0 Then
                        StrValue = So1(3) & " " & StrValue
                    ElseIf donvi > 0 Then
                        StrValue = So(donvi) & " " & StrValue
                    End If
                End If
                If chuc < 0 Then
                    Exit Do
                Else
                    If chuc = 0 And donvi > 0 Then
                        StrValue = So1(0) & " " & StrValue
                    ElseIf chuc = 1 Then
                        StrValue = So1(4) & " " & StrValue
                    ElseIf chuc > 1 Then
                        StrValue = So(chuc) & " " & So1(5) & " " & StrValue
                    End If
                End If
                If tram < 0 Then
                    Exit Do
                Else
                    If tram > 0 Or chuc > 0 Or donvi > 0 Then
                        StrValue = So(tram) & " " & "trăm" & " " & StrValue 'Lưu ý bảng mã 
                    End If
                End If
            Loop
        End If
        For I = 1 To 3
            StrValue = StrValue.Replace(Hang(I), Hang(I) & "")
        Next
        StrValue = StrValue.Replace(", " & Hang(3), " " & Hang(3))
        StrValue = Trim(StrValue)
        StrValue = StrValue.TrimEnd(",")
        StrValue = UCase(Microsoft.VisualBasic.Left(StrValue, 1)) & Microsoft.VisualBasic.Right(StrValue, Len(StrValue) - 1)
        NumToText = StrValue
    End Function
End Module
